home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / social / facebook / objects.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  24KB  |  618 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. import time
  5. from util.observe import ObservableList
  6. from datetime import date
  7. from collections import defaultdict
  8. from util import do, iproperty, strftime_u
  9. from datetime import datetime
  10. from logging import getLogger
  11. from itertools import chain
  12. log = getLogger('facebook.objects')
  13.  
  14. class Alerts(object):
  15.     stuff = [
  16.         'num_msgs',
  17.         'msgs_time',
  18.         'num_pokes',
  19.         'pokes_time',
  20.         'num_shares',
  21.         'shares_time',
  22.         'friend_requests',
  23.         'group_invites',
  24.         'event_invites']
  25.     urls = dict(msgs = 'http://www.facebook.com/inbox/', pokes = 'http://www.facebook.com/home.php', shares = 'http://www.facebook.com/posted.php', friend_requests = 'http://www.facebook.com/reqs.php', group_invites = 'http://www.facebook.com/reqs.php#group', event_invites = 'http://www.facebook.com/reqs.php#event')
  26.     
  27.     def __init__(self, fb = None, notifications_get_xml = None):
  28.         log.debug('type(notifications_get_xml) ==> %r', type(notifications_get_xml))
  29.         self.fb = fb
  30.         if notifications_get_xml is not None:
  31.             log.debug('here')
  32.             t = notifications_get_xml
  33.             self.num_msgs = int(t.messages.unread)
  34.             self.msgs_time = int(t.messages.most_recent)
  35.             self.num_pokes = int(t.pokes.unread)
  36.             self.pokes_time = int(t.pokes.most_recent)
  37.             self.num_shares = int(t.shares.unread)
  38.             self.shares_time = int(t.shares.most_recent)
  39.             self.friend_requests = set((lambda .0: for uid in .0:
  40. int(uid))(t.friend_requests))
  41.             self.group_invites = set((lambda .0: for gid in .0:
  42. int(gid))(t.group_invites))
  43.             self.event_invites = set((lambda .0: for eid in .0:
  44. int(eid))(t.event_invites))
  45.         else:
  46.             self.num_msgs = 0
  47.             self.msgs_time = 0
  48.             self.num_pokes = 0
  49.             self.pokes_time = 0
  50.             self.num_shares = 0
  51.             self.shares_time = 0
  52.             self.friend_requests = set()
  53.             self.group_invites = set()
  54.             self.event_invites = set()
  55.             log.debug('there')
  56.  
  57.     
  58.     def __repr__(self):
  59.         pformat = pformat
  60.         import pprint
  61.         s = []([ (a, getattr(self, a)) for a in self.stuff ])
  62.         return '<Alerts %s>' % s
  63.  
  64.     
  65.     def __sub__(self, other):
  66.         ret = Alerts(self.fb)
  67.         for attr in self.stuff:
  68.             setattr(ret, attr, getattr(self, attr) - getattr(other, attr))
  69.         
  70.         return ret
  71.  
  72.     
  73.     def __cmp__(self, other):
  74.         if type(self) != type(other):
  75.             return 1
  76.         
  77.         for attr in self.stuff:
  78.             if getattr(self, attr) != getattr(other, attr):
  79.                 if not self.num_all - other.num_all:
  80.                     pass
  81.                 return 1
  82.                 continue
  83.         
  84.         return 0
  85.  
  86.     
  87.     def num_all(self):
  88.         return sum([
  89.             self.num_msgs,
  90.             self.num_pokes,
  91.             self.num_shares,
  92.             len(self.friend_requests),
  93.             len(self.group_invites),
  94.             len(self.event_invites)])
  95.  
  96.     num_all = property(num_all)
  97.     
  98.     def count(self):
  99.         return sum([
  100.             self['num_msgs'],
  101.             self['num_pokes'],
  102.             self['num_shares'],
  103.             self['num_friend_requests'],
  104.             self['num_group_invites'],
  105.             self['num_event_invites']])
  106.  
  107.     count = property(count)
  108.     
  109.     def num_friend_requests(self):
  110.         return len(self.friend_requests)
  111.  
  112.     num_friend_requests = property(num_friend_requests)
  113.     
  114.     def num_group_invites(self):
  115.         return len(self.group_invites)
  116.  
  117.     num_group_invites = property(num_group_invites)
  118.     
  119.     def num_event_invites(self):
  120.         return len(self.event_invites)
  121.  
  122.     num_event_invites = property(num_event_invites)
  123.     
  124.     def __nonzero__(self):
  125.         return (any,)((lambda .0: for attr in .0:
  126. getattr(self, attr))(self.stuff))
  127.  
  128.     
  129.     def __getitem__(self, key):
  130.         if not hasattr(self, 'fb') or self.fb is None:
  131.             raise KeyError(key)
  132.         
  133.         return self.fb.filters['alerts'][key] * getattr(self, key)
  134.  
  135.  
  136.  
  137. class NewsfeedItem(object):
  138.     
  139.     def __init__(self, name = 'foo'):
  140.         self.hidden = False
  141.         self.correct_time = True
  142.  
  143.     
  144.     def set_time(self, time):
  145.         if time is not None:
  146.             dt = datetime.fromtimestamp(time)
  147.             self.formatted_time = strftime_u(dt, '%#I:%M') + strftime_u(dt, '%p').lower()
  148.         
  149.         self._time = time
  150.  
  151.     
  152.     def get_time(self):
  153.         return self._time
  154.  
  155.     time = property(get_time, set_time)
  156.     
  157.     def __repr__(self):
  158.         return '<' + type(self).__name__ + ' ' + (' '.join,)((lambda .0: for attr in .0:
  159. if not attr.startswith('_'):
  160. '%s=%r' % (attr, getattr(self, attr))continue)(list(self.__dict__) + [
  161.             'time'])) + '>'
  162.  
  163.     link = iproperty('get_link', 'set_link')
  164.     text = iproperty('get_text')
  165.     
  166.     def get_link(self):
  167.         return 'http://www.facebook.com/'
  168.  
  169.     
  170.     def set_link(self, link):
  171.         pass
  172.  
  173.     
  174.     def get_text(self):
  175.         raise NotImplementedError
  176.  
  177.     
  178.     def __unicode__(self):
  179.         text = self.text
  180.         return text
  181.  
  182.     
  183.     def his_her_their(self):
  184.         s = self.sex
  185.         if s == 'female':
  186.             return 'her'
  187.         elif s == 'male':
  188.             return 'his'
  189.         else:
  190.             return 'their'
  191.  
  192.     his_her_their = property(his_her_their)
  193.  
  194.  
  195. class ZeroTime(object):
  196.     time = 0
  197.  
  198.  
  199. class NewsfeedList(list):
  200.     
  201.     def update_recent(self):
  202.         self.most_recent = max((lambda .0: for thing in .0:
  203. thing.time)(self + [
  204.             ZeroTime]))
  205.  
  206.     
  207.     def extend(self, *a, **k):
  208.         list.extend(self, *a, **k)
  209.         self.update_recent()
  210.  
  211.  
  212.  
  213. class Statuses(NewsfeedList):
  214.     
  215.     def __init__(self, statuses_xml):
  216.         NewsfeedList.__init__(self)
  217.         (do,)((lambda .0: for user in .0:
  218. self.append(Status(user)))(statuses_xml))
  219.         self.update_recent()
  220.  
  221.  
  222.  
  223. class Status(NewsfeedItem):
  224.     
  225.     def __init__(self, user):
  226.         NewsfeedItem.__init__(self, 'status')
  227.         self.time = int(user.status.time)
  228.         self.uid = int(user.uid)
  229.         self.name = unicode(user.name)
  230.         self.message = unicode(user.status.message)
  231.  
  232.  
  233.  
  234. class Profiles(object):
  235.     
  236.     def __init__(self, profiles_xml):
  237.         self.data = defaultdict((lambda : defaultdict(set)))
  238.         self.update(profiles_xml)
  239.  
  240.     
  241.     def update(self, profiles_xml):
  242.         new_profiles = [ Profile(user) for user in profiles_xml ]
  243.         for p in new_profiles:
  244.             self.data[date.fromtimestamp(p.time)][p.uid].add(p)
  245.         
  246.         return new_profiles
  247.  
  248.     
  249.     def __iter__(self, include_hidden = False):
  250.         for d in self.data.itervalues():
  251.             for user in d.itervalues():
  252.                 user = max((chain,)((lambda .0: for u in .0:
  253. if not (u.hidden) or include_hidden:
  254. ucontinue)(user), iter([
  255.                     ZeroTime])), key = (lambda x: x.time))
  256.                 if user is not ZeroTime:
  257.                     yield user
  258.                     continue
  259.             
  260.         
  261.  
  262.  
  263.  
  264. class Profile(NewsfeedItem):
  265.     
  266.     def __init__(self, user):
  267.         NewsfeedItem.__init__(self, 'profile')
  268.         self.time = int(user.profile_update_time)
  269.         self.uid = int(user.uid)
  270.         self.name = unicode(user.name)
  271.         self.sex = unicode(user.sex)
  272.  
  273.  
  274.  
  275. class WallNoteCounts(list):
  276.     
  277.     def __init__(self, counts_xml, time_ = None):
  278.         list.__init__(self)
  279.         (None, do)((lambda .0: for user in .0:
  280. self.append(WallNoteCount(user, time_)))(counts_xml))
  281.         if self:
  282.             t = self[0].time
  283.             for user in self[1:]:
  284.                 user.time = t
  285.             
  286.         
  287.  
  288.  
  289.  
  290. class WallNoteCount(object):
  291.     
  292.     def __init__(self, user, time_ = None):
  293.         self.time = None if time_ is not None else int(user.anon)
  294.         self.uid = int(user.uid)
  295.         self.name = unicode(user.name)
  296.         self.wall_count = None if getattr(user, 'wall_count', False) else -1
  297.         self.notes_count = None if getattr(user, 'notes_count', False) else -1
  298.         self.birthday = None if getattr(user, 'birthday', False) else None
  299.  
  300.  
  301.  
  302. class FriendsWall(NewsfeedItem):
  303.     
  304.     def __init__(self, wall_note):
  305.         NewsfeedItem.__init__(self, 'friends_wall')
  306.         self.time = wall_note.time
  307.         self.uid = wall_note.uid
  308.         self.name = wall_note.name
  309.         self.wall_count = wall_note.wall_count
  310.  
  311.     
  312.     def __hash__(self):
  313.         return hash(self.uid)
  314.  
  315.     
  316.     def __cmp__(self, other):
  317.         return cmp(self.uid, other.uid)
  318.  
  319.  
  320.  
  321. class FriendsNotes(NewsfeedItem):
  322.     
  323.     def __init__(self, wall_note):
  324.         NewsfeedItem.__init__(self, 'friends_notes')
  325.         self.time = wall_note.time
  326.         self.uid = wall_note.uid
  327.         self.name = wall_note.name
  328.         self.notes_count = wall_note.notes_count
  329.  
  330.     
  331.     def __hash__(self):
  332.         return hash(self.uid)
  333.  
  334.     
  335.     def __cmp__(self, other):
  336.         return cmp((self.uid, self.notes_count), (other.uid, other.notes_count))
  337.  
  338.  
  339.  
  340. class Albums(NewsfeedList):
  341.     
  342.     def __init__(self, albums_xml):
  343.         NewsfeedList.__init__(self)
  344.         (do,)((lambda .0: for album in .0:
  345. self.append(Album(album)))(albums_xml))
  346.         self.update_recent()
  347.  
  348.  
  349.  
  350. class Album(NewsfeedItem):
  351.     
  352.     def __init__(self, album):
  353.         NewsfeedItem.__init__(self, 'photos')
  354.         self.time = None if album.modified else None
  355.         self.link = unicode(album.link)
  356.         self.aid = int(album.aid)
  357.         self.name = unicode(album.name)
  358.         self.owner = None if album.owner else None
  359.  
  360.     
  361.     def __hash__(self):
  362.         return hash(self.aid)
  363.  
  364.     
  365.     def __cmp__(self, other):
  366.         return cmp(self.aid, other.aid)
  367.  
  368.  
  369.  
  370. class Photos(set):
  371.     
  372.     def __init__(self, photos_xml, time_ = None):
  373.         set.__init__(self)
  374.         (None, do)((lambda .0: for photo in .0:
  375. self.add(Photo(photo, time_)))(photos_xml))
  376.  
  377.  
  378.  
  379. class Photo(object):
  380.     
  381.     def __init__(self, photo, time_ = None):
  382.         self.pid = int(photo.pid)
  383.         self.aid = int(photo.aid)
  384.         self.owner = int(photo.owner)
  385.         if photo.created:
  386.             self.time = int(photo.created)
  387.         elif time_ is not None:
  388.             self.time = time_
  389.         else:
  390.             self.time = int(photo.anon)
  391.  
  392.     
  393.     def __hash__(self):
  394.         return hash(self.pid)
  395.  
  396.     
  397.     def __cmp__(self, other):
  398.         return cmp(self.pid, other.pid)
  399.  
  400.  
  401.  
  402. class Tagged(NewsfeedItem):
  403.     
  404.     def __init__(self, album):
  405.         NewsfeedItem.__init__(self, 'tagged')
  406.         self.time = max((lambda .0: for x in .0:
  407. x.time)(album))
  408.         self.count = len(album)
  409.  
  410.  
  411.  
  412. class Wall(NewsfeedItem):
  413.     
  414.     def __init__(self, q):
  415.         NewsfeedItem.__init__(self, 'your_wall')
  416.         self.uid = int(q.user.uid)
  417.         self.count = None if q.user.wall_count else None
  418.         self.time = int(q.user.anon)
  419.  
  420.  
  421.  
  422. class NewsFeed(ObservableList):
  423.     
  424.     def __init__(self):
  425.         ObservableList.__init__(self)
  426.         self.albums = defaultdict(dict)
  427.         self.profiles = Profiles([])
  428.         self.statuses = Statuses([])
  429.         self.walls = []
  430.         self.tags = defaultdict((lambda : defaultdict(set)))
  431.         self.known_photos = set()
  432.         self.album_names = { }
  433.         self.friends_notes = set()
  434.         self.friends_walls = defaultdict(dict)
  435.         self.friends_walls_totals = { }
  436.         self.fbtime = int(time.time())
  437.         self.clock = self.fbtime
  438.  
  439.     
  440.     def now(self):
  441.         now = int(time.time())
  442.         return (now - self.clock) + self.fbtime
  443.  
  444.     now = property(now)
  445.     
  446.     def get_aids(self):
  447.         retval = set()
  448.         for day, albums in self.tags.items():
  449.             retval.update(albums.keys())
  450.         
  451.         return retval
  452.  
  453.     
  454.     def get_unknown_aids(self):
  455.         return self.get_aids() - set(self.album_names.keys())
  456.  
  457.     
  458.     def get_unknown_album_owners(self):
  459.         owners = set((lambda .0: for d in .0:
  460. for album in d.values():
  461. album.owner)(self.albums.values()))
  462.         return owners - set(self.friends_walls_totals.keys())
  463.  
  464.     
  465.     def update_aid_names(self, albums):
  466.         if isinstance(albums, dict):
  467.             for d in albums.values():
  468.                 for album in d.values():
  469.                     self.album_names[album.aid] = (album.name, album.link)
  470.                 
  471.             
  472.         elif isinstance(albums, list):
  473.             for album in albums:
  474.                 self.album_names[album.aid] = (album.name, album.link)
  475.             
  476.         
  477.  
  478.     
  479.     def rebuild(self):
  480.         tags = []
  481.         for day, albums in self.tags.items():
  482.             for aid, s in albums.items():
  483.                 if max((lambda .0: for x in .0:
  484. x.time)(s)) != 0:
  485.                     t = Tagged(s)
  486.                     (t.album_name, t.link) = self.album_names[aid]
  487.                     tags.append(t)
  488.                     continue
  489.             
  490.         
  491.         notes = _[1]
  492.         fwalls = []
  493.         for day, d in self.friends_walls.items():
  494.             for wall in d.values():
  495.                 if wall.time != 0 and wall.wall_count > 0:
  496.                     fwalls.append(wall)
  497.                     continue
  498.                 []
  499.             
  500.         
  501.         albums = []
  502.         for d in self.albums.values():
  503.             for album in d.values():
  504.                 album.owner_name = self.friends_walls_totals[album.owner].name
  505.                 albums.append(album)
  506.             
  507.         
  508.         profiles = [ profile for profile in self.profiles ]
  509.         statuses = _[3]
  510.         self[:] = sorted(albums + profiles + statuses + self.walls[1:] + tags + notes + fwalls, key = (lambda x: x.time), reverse = True)
  511.         log.info('finished rebuild')
  512.  
  513.     
  514.     def update_albums(self, albums, rebuild = False):
  515.         for a in albums:
  516.             atime = date.fromtimestamp(a.time)
  517.             if a.aid not in self.albums[atime] or self.albums[atime][a.aid].time <= a.time:
  518.                 self.albums[atime][a.aid] = a
  519.                 continue
  520.         
  521.         self.update_aid_names(self.albums)
  522.         if rebuild:
  523.             self.rebuild()
  524.         
  525.  
  526.     
  527.     def update_profiles(self, profiles):
  528.         return self.profiles.update(profiles)
  529.  
  530.     
  531.     def init_tags(self, photos):
  532.         for photo in photos:
  533.             self.tags[date.fromtimestamp(photo.time)][photo.aid].add(photo)
  534.         
  535.         self.known_photos.update(photos)
  536.  
  537.     
  538.     def update_tags(self, photos, rebuild = False):
  539.         new_photos = set(photos) - self.known_photos
  540.         for photo in new_photos:
  541.             if photo not in self.tags[date.fromtimestamp(photo.time)][photo.aid]:
  542.                 self.tags[date.fromtimestamp(photo.time)][photo.aid].add(photo)
  543.                 continue
  544.         
  545.         self.known_photos.update(new_photos)
  546.         if rebuild:
  547.             self.rebuild()
  548.         
  549.  
  550.     
  551.     def update_statuses(self, statuses, rebuild = False):
  552.         self.statuses.extend(statuses)
  553.         if rebuild:
  554.             self.rebuild()
  555.         
  556.  
  557.     
  558.     def update_counts(self, wall_note_counts):
  559.         notes = []([ FriendsNotes(c) for c in wall_note_counts ])
  560.         new_notes = notes - self.friends_notes
  561.         self.friends_notes |= new_notes
  562.         new_walls = [ FriendsWall(c) for c in wall_note_counts ]
  563.         new_walls = _[3]
  564.         for wall in new_walls:
  565.             self.friends_walls[date.fromtimestamp(wall.time)][wall.uid] = wall
  566.             self.friends_walls_totals[wall.uid] = wall
  567.         
  568.         return (new_walls, new_notes)
  569.  
  570.     
  571.     def update_wall(self, wall, rebuild = False):
  572.         self.fbtime = wall.time
  573.         self.clock = int(time.time())
  574.         if wall.count is None:
  575.             return None
  576.         
  577.         if self.walls:
  578.             if wall.count > self.walls[-1].count:
  579.                 if date.fromtimestamp(self.walls[-1].time) == date.fromtimestamp(wall.time):
  580.                     self.walls[-1] = wall
  581.                 else:
  582.                     self.walls.append(wall)
  583.                 if rebuild:
  584.                     self.rebuild()
  585.                 
  586.             
  587.         else:
  588.             wall.time = 0
  589.             self.walls.append(wall)
  590.  
  591.     
  592.     def __iter__(self):
  593.         stuff = self[:]
  594.         date = date
  595.         import datetime
  596.         last = False
  597.         now = self.now
  598.         today = date.fromtimestamp(now)
  599.         yesterday = date.fromtimestamp(now - 86400)
  600.         for thing in stuff:
  601.             this = date.fromtimestamp(thing.time)
  602.             if not last and this != today:
  603.                 yield None
  604.             
  605.             if not last and this == today:
  606.                 pass
  607.             elif last == this:
  608.                 pass
  609.             elif this == yesterday:
  610.                 yield 'Yesterday'
  611.             else:
  612.                 yield strftime_u(this, '%B %d')
  613.             yield thing
  614.             last = this
  615.         
  616.  
  617.  
  618.